package org.halvors.electrometrics.common.updater;
import cpw.mods.fml.common.event.FMLInterModComms;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.MinecraftForge;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.spi.AbstractLogger;
import org.halvors.electrometrics.Electrometrics;
import org.halvors.electrometrics.common.ConfigurationManager.Integration;
import org.halvors.electrometrics.common.base.IUpdatableMod;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
public class UpdateThread extends Thread {
private final IUpdatableMod mod;
private final String releaseUrl, downloadUrl;
private ModVersion newModVersion;
private boolean isCheckCompleted;
private boolean isNewVersionAvailable;
private boolean isCriticalUpdate;
public UpdateThread(IUpdatableMod mod, String releaseUrl, String downloadUrl) {
super(mod.getModId() + " updater");
this.mod = mod;
this.releaseUrl = releaseUrl;
this.downloadUrl = downloadUrl;
}
@Override
public void run() {
try {
// This is our current locally used version.
ModVersion ourVersion = ModVersion.parse(mod.getModName(), MinecraftForge.MC_VERSION + "-" + mod.getModVersion());
// Fetch the new version from the internet.
URL versionFile = new URL(releaseUrl);
BufferedReader reader = new BufferedReader(new InputStreamReader(versionFile.openStream()));
newModVersion = ModVersion.parse(mod.getModName(), reader.readLine());
ModVersion criticalVersion = ModVersion.parse(mod.getModName(), reader.readLine());
reader.close();
isNewVersionAvailable = ourVersion.compareTo(newModVersion) < 0;
if (isNewVersionAvailable) {
Electrometrics.getLogger().info("An updated version of " + mod.getModName() + " is available: " + newModVersion + ".");
if (ourVersion.getMinecraftVersion().compareTo(newModVersion.getMinecraftVersion()) < 0) {
ReleaseVersion newReleaseVersion = newModVersion.getMinecraftVersion();
ReleaseVersion ourReleaseVersion = ourVersion.getMinecraftVersion();
isNewVersionAvailable = newReleaseVersion.getMajor() == ourReleaseVersion.getMajor() && newReleaseVersion.getMinor() == ourReleaseVersion.getMinor();
}
if (criticalVersion != null && ourVersion.compareTo(criticalVersion) >= 0) {
isCriticalUpdate = Boolean.parseBoolean(criticalVersion.getDescription());
isCriticalUpdate &= isNewVersionAvailable;
}
}
if (isCriticalUpdate) {
Electrometrics.getLogger().info("This update has been marked as CRITICAL and will ignore notification suppression.");
}
// VersionChecker integration.
if (Integration.isVersionCheckerEnabled) {
NBTTagCompound nbtTagCompound = new NBTTagCompound();
nbtTagCompound.setString("modDisplayName", mod.getModName());
nbtTagCompound.setString("oldVersion", ourVersion.toString());
nbtTagCompound.setString("newVersion", newModVersion.toString());
if (downloadUrl != null) {
nbtTagCompound.setString("updateUrl", downloadUrl);
nbtTagCompound.setBoolean("isDirectLink", false);
}
FMLInterModComms.sendRuntimeMessage(mod.getModId(), "VersionChecker", "addUpdate", nbtTagCompound);
isNewVersionAvailable &= isCriticalUpdate;
}
} catch (Exception e) {
Electrometrics.getLogger().log(Level.WARN, AbstractLogger.CATCHING_MARKER, "Update check for " + mod.getModName() + " failed.", e);
}
isCheckCompleted = true;
}
public boolean isCheckCompleted() {
return isCheckCompleted;
}
public boolean isCriticalUpdate() {
return isCriticalUpdate;
}
public boolean isNewVersionAvailable() {
return isNewVersionAvailable;
}
public ModVersion getNewModVersion() {
return newModVersion;
}
}